home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / hobbes3 / text.asm < prev    next >
Assembly Source File  |  1992-10-01  |  15KB  |  473 lines

  1. include hobbes.inc
  2. include extrn.inc
  3.  
  4. .CODE
  5.  
  6. Font3x5:
  7.   db  7,5,5,5,7,0,0,0, 2,3,2,2,7,0,0,0, 2,5,4,2,7,0,0,0, 3,4,2,4,3,0,0,0 ; 0123
  8.   db  4,5,7,4,4,0,0,0, 7,1,3,4,3,0,0,0, 6,1,3,5,2,0,0,0, 7,4,2,2,2,0,0,0 ; 4567
  9.   db  2,5,2,5,2,0,0,0, 2,5,6,4,4,0,0,0, 2,5,7,5,5,0,0,0, 3,5,3,5,3,0,0,0 ; 89AB
  10.   db  2,5,1,5,2,0,0,0, 3,5,5,5,3,0,0,0, 7,1,3,1,7,0,0,0, 7,1,3,1,1,0,0,0 ; CDEF
  11.   db  0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
  12.   db  0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
  13.   db  0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
  14.   db  0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0
  15.   db  0,0,0,0,0,0,0,0, 2,2,2,0,2,0,0,0, 5,5,0,0,0,0,0,0, 5,7,5,7,5,0,0,0 ;  !"#
  16.   db  0,0,0,0,0,0,0,0, 5,4,2,1,5,0,0,0, 0,0,0,0,0,0,0,0, 4,4,2,0,0,0,0,0 ; $%&'
  17.   db  2,1,1,1,2,0,0,0, 2,4,4,4,2,0,0,0, 0,7,7,7,0,0,0,0, 0,2,7,2,0,0,0,0 ; ()*+
  18.   db  0,0,0,4,2,0,0,0, 0,0,7,0,0,0,0,0, 0,0,0,0,2,0,0,0, 4,4,2,1,1,0,0,0 ; ,-./
  19.   db  7,5,5,5,7,0,0,0, 2,3,2,2,7,0,0,0, 2,5,4,2,7,0,0,0, 3,4,2,4,3,0,0,0 ; 0123
  20.   db  4,5,7,4,4,0,0,0, 7,1,3,4,3,0,0,0, 6,1,3,5,2,0,0,0, 7,4,2,2,2,0,0,0 ; 4567
  21.   db  2,5,2,5,2,0,0,0, 2,5,6,4,4,0,0,0, 0,2,0,2,0,0,0,0, 0,2,0,2,1,0,0,0 ; 89:;
  22.   db  4,2,1,2,4,0,0,0, 0,7,0,7,0,0,0,0, 1,2,4,2,1,0,0,0, 2,5,4,2,2,0,0,0 ; <=>?
  23.   db  2,5,7,1,6,0,0,0, 2,5,7,5,5,0,0,0, 3,5,3,5,3,0,0,0, 2,5,1,5,2,0,0,0 ; @ABC
  24.   db  3,5,5,5,3,0,0,0, 7,1,3,1,7,0,0,0, 7,1,3,1,1,0,0,0, 6,1,1,5,6,0,0,0 ; DEFG
  25.   db  5,5,7,5,5,0,0,0, 7,2,2,2,7,0,0,0, 4,4,4,5,2,0,0,0, 5,5,3,5,5,0,0,0 ; HIJK
  26.   db  1,1,1,1,7,0,0,0, 5,7,7,5,5,0,0,0, 5,7,7,7,5,0,0,0, 2,5,5,5,2,0,0,0 ; LMNO
  27.   db  3,5,3,1,1,0,0,0, 2,5,5,7,6,0,0,0, 3,5,3,5,5,0,0,0, 6,1,2,4,3,0,0,0 ; PQRS
  28.   db  7,2,2,2,2,0,0,0, 5,5,5,5,7,0,0,0, 5,5,5,5,2,0,0,0, 5,5,5,7,5,0,0,0 ; TUVW
  29.   db  5,5,2,5,5,0,0,0, 5,5,2,2,2,0,0,0, 7,4,2,1,7,0,0,0, 7,1,1,1,7,0,0,0 ; XYZ[
  30.   db  1,1,2,4,4,0,0,0, 7,4,4,4,7,0,0,0, 0,2,5,0,0,0,0,0, 0,0,0,0,7,0,0,0 ; \]^_
  31.   db  1,2,0,0,0,0,0,0, 0,0,6,5,6,0,0,0, 1,1,3,5,3,0,0,0, 0,0,6,1,6,0,0,0 ; `abc
  32.   db  4,4,6,5,6,0,0,0, 0,0,6,3,6,0,0,0, 4,2,7,2,2,0,0,0, 0,0,6,5,6,3,0,0 ; defg
  33.   db  1,1,3,5,5,0,0,0, 0,2,0,2,2,0,0,0, 0,2,0,2,2,1,0,0, 1,1,5,3,5,0,0,0 ; hijk
  34.   db  2,2,2,2,2,0,0,0, 0,0,7,7,5,0,0,0, 0,0,3,5,5,0,0,0, 0,0,2,5,2,0,0,0 ; lmno
  35.   db  0,0,3,5,3,1,0,0, 0,0,6,5,6,4,0,0, 0,0,3,1,1,0,0,0, 0,0,6,2,3,0,0,0 ; pqrs
  36.   db  2,7,2,2,4,0,0,0, 0,0,5,5,6,0,0,0, 0,0,5,5,2,0,0,0, 0,0,5,7,7,0,0,0 ; tuvw
  37.   db  0,0,5,2,5,0,0,0, 0,0,5,6,4,7,0,0, 0,0,3,2,6,0,0,0, 6,2,1,2,6,0,0,0 ; xyz{
  38.   db  2,2,2,2,2,0,0,0, 3,2,4,2,3,0,0,0, 0,0,3,6,0,0,0,0, 7,7,7,7,7,7,0,0 ; |}~<block>
  39.  
  40.   db  1,1,3,5,5,9,1,1, 4,4,4,4,4,4,5,5,15,1,1,1,1,15,1,1,7,0,0,0,0,0,0,0 ; N E
  41.   db 15,8,8,8,8,8,8,8, 7,0,0,0,0,0,0,0,12,2,1,1,2,12,0,0,1,2,4,0,0,1,2,4 ; T S
  42.   db 15,1,1,1,1,15,1,1,1,2,4,4,2,1,0,0, 8,8,4,4,4,2,2,14,0,0,1,1,1,2,2,3 ; P A
  43.   db 12,2,1,1,1,1,1,1, 1,2,4,0,0,0,0,0,15,1,1,1,1,15,1,1,7,0,0,0,0,0,0,0 ; C E
  44.   db  1,1,1,0,0,0,0,0, 6,4,4,0,0,0,0,0, 1,1,15,0,0,0,0,0,0,0,7,0,0,0,0,0 ;  N E
  45.   db  8,8,8,0,0,0,0,0, 0,0,0,0,0,0,0,0, 1,2,12,0,0,0,0,0,4,2,1,0,0,0,0,0 ;  T S
  46.   db  1,1,1,0,0,0,0,0, 0,0,0,0,0,0,0,0, 1,1,1,0,0,0,0,0, 4,4,4,0,0,0,0,0 ;  P A
  47.   db  1,2,12,0,0,0,0,0,4,2,1,0,0,0,0,0, 1,1,15,0,0,0,0,0,0,0,7,0,0,0,0,0 ;  C E
  48.  
  49.  
  50. ;-----------------------------------------------------------------------
  51. ; void Text(int X, int Y, char *TEXT, COLOR)
  52. ;
  53.         public  _Text
  54. _Text proc far
  55. ARG X, Y, TEXT:DWORD, COLOR
  56.         push    bp
  57.         mov     bp,sp
  58.         push    ds
  59.         push    si
  60.         push    di
  61.  
  62.         mov     es,_ModeX_Segment       ; put video segment in ES
  63.         mov     di,Y
  64.         shl     di,1
  65.         mov     di,_RowOffset[di]
  66.         add     di,X                    ; put video offset in di
  67.  
  68.         lds     si,dword ptr TEXT       ; set ds:si to point to the text
  69.         mov     ch,byte ptr COLOR
  70.  
  71.         mov     dx,SC_INDEX
  72.         mov     al,MAP_MASK
  73.         out     dx,al
  74.         inc     dx
  75. @@TXY_loop:
  76.         lodsb
  77.         and     ax,255
  78.         jz      @@TXY_end
  79.         mov     bx,ax
  80.         shl     bx,3
  81.         add     bx,offset Font3x5
  82.         mov     al,cs:[bx]
  83.         out     dx,al
  84.         mov     es:[di],ch
  85.         inc     bx
  86.         add     di,_Virtual_Width_Addr
  87.         mov     al,cs:[bx]
  88.         out     dx,al
  89.         mov     es:[di],ch
  90.         inc     bx
  91.         add     di,_Virtual_Width_Addr
  92.         mov     al,cs:[bx]
  93.         out     dx,al
  94.         mov     es:[di],ch
  95.         inc     bx
  96.         add     di,_Virtual_Width_Addr
  97.         mov     al,cs:[bx]
  98.         out     dx,al
  99.         mov     es:[di],ch
  100.         inc     bx
  101.         add     di,_Virtual_Width_Addr
  102.         mov     al,cs:[bx]
  103.         out     dx,al
  104.         mov     es:[di],ch
  105.         inc     bx
  106.         add     di,_Virtual_Width_Addr
  107.         mov     al,cs:[bx]
  108.         out     dx,al
  109.         mov     es:[di],ch
  110.         inc     bx
  111. ;        sub     di,5*80-1
  112.         mov        ax,_Virtual_Width_Addr
  113.         shl        ax,2
  114.         add        ax,_Virtual_Width_Addr
  115.         dec        ax
  116.         sub        di,ax
  117.         jmp     short @@TXY_loop
  118. @@TXY_end:
  119.         pop     di
  120.         pop     si
  121.         pop     ds
  122.         pop     bp
  123.         ret
  124. _Text endp
  125.  
  126.  
  127.  
  128. public _CharHeight
  129. public _CharWidth
  130. public _FontPtr
  131. public _FirstChar
  132. public _UserFontPtr
  133. public _UserChHeight
  134. public _UserChWidth
  135. public _UserFirstCh
  136.  
  137. _FontDriverActive db 0
  138.  
  139. _CharHeight   db         0
  140. _CharWidth    db         0
  141. _FontPtr      dw  2 dup (0)
  142. _FirstChar    db         0
  143.  
  144. _UserFontPtr   dw  2 dup (0)
  145. _UserChHeight  db         0
  146. _UserChWidth   db         0
  147. _UserFirstCh   db         0
  148.  
  149.  
  150. F8x8Ptr       dw  2 dup (0)
  151. F8x14Ptr      dw  2 dup (0)
  152.  
  153. MirrorTable  label byte
  154.     db   0,128, 64,192, 32,160, 96,224, 16,144, 80,208, 48,176,112,240
  155.     db   8,136, 72,200, 40,168,104,232, 24,152, 88,216, 56,184,120,248
  156.     db   4,132, 68,196, 36,164,100,228, 20,148, 84,212, 52,180,116,244
  157.     db  12,140, 76,204, 44,172,108,236, 28,156, 92,220, 60,188,124,252
  158.     db   2,130, 66,194, 34,162, 98,226, 18,146, 82,210, 50,178,114,242
  159.     db  10,138, 74,202, 42,170,106,234, 26,154, 90,218, 58,186,122,250
  160.     db   6,134, 70,198, 38,166,102,230, 22,150, 86,214, 54,182,118,246
  161.     db  14,142, 78,206, 46,174,110,238, 30,158, 94,222, 62,190,126,254
  162.     db   1,129, 65,193, 33,161, 97,225, 17,145, 81,209, 49,177,113,241
  163.     db   9,137, 73,201, 41,169,105,233, 25,153, 89,217, 57,185,121,249
  164.     db   5,133, 69,197, 37,165,101,229, 21,149, 85,213, 53,181,117,245
  165.     db  13,141, 77,205, 45,173,109,237, 29,157, 93,221, 61,189,125,253
  166.     db   3,131, 67,195, 35,163, 99,227, 19,147, 83,211, 51,179,115,243
  167.     db  11,139, 75,203, 43,171,107,235, 27,155, 91,219, 59,187,123,251
  168.     db   7,135, 71,199, 39,167,103,231, 23,151, 87,215, 55,183,119,247
  169.     db  15,143, 79,207, 47,175,111,239, 31,159, 95,223, 63,191,127,255
  170.  
  171. MirrorTableOffs dw         ?
  172.  
  173.  
  174. ;----------------------------------------------------------------------
  175. ; InitText    - Initializes the Mode X text driver and sets the
  176. ;                  default font (VGA ROM 8x8)
  177. ;
  178. ; C caller:
  179. ;
  180. ;  x_text_init()
  181. ;
  182. ; Written by Themie Gouthas
  183. ; modified by Court Demas
  184. ;----------------------------------------------------------------------
  185.     public _InitText
  186. _InitText proc
  187.     push bp
  188.  
  189.     mov  [_FontDriverActive],1
  190.     mov  ax,1130h                   ; AH = BIOS generator function
  191.                                     ; AL = BIOS get font pointer subfunction
  192.     push ax                         ; Save Video interrupt function parameters
  193.     mov  bh,3                       ; Select 8x8 VGA ROM font
  194.     int  10h                        ; Call BIOS video interrupt
  195.     mov  word ptr [F8x8Ptr],bp      ; Save 8x8 Font address in FontPtr table
  196.     mov  word ptr [F8x8Ptr+2],es
  197.  
  198.     mov  word ptr [_FontPtr],bp     ; Default font = 8x8 ROM font
  199.     mov  word ptr [_FontPtr+2],es
  200.  
  201.     pop  ax                         ; Recall Video interrupt function parameters
  202.     mov  bh,2                       ; Select 8x14 VGA ROM font
  203.     int  10h                        ; Call BIOS video interrupt
  204.     mov  word ptr [F8x14Ptr],bp     ; Save 8x14 Font address in FontPtr table
  205.     mov  word ptr [F8x14Ptr+2],es
  206.  
  207.  
  208.     mov  al,8
  209.     mov  [_CharHeight],al            ; Set the font character heights
  210.     mov  [_CharWidth] ,al            ; Set the font character widths
  211.  
  212.     mov  dx,offset MirrorTable       ; Initialize mirror table offset
  213.     mov  cs:[MirrorTableOffs],dx
  214.  
  215.     pop  bp
  216.     ret
  217. _InitText endp
  218.  
  219.  
  220.  
  221. ;----------------------------------------------------------------------
  222. ; SetFont - Mode X Set current font for text drawing
  223. ;
  224. ; C caller:
  225. ;
  226. ;  x_set_font(int FontID)
  227. ;
  228. ; PARAMETERS  FontID    0 = VGA ROM 8x8
  229. ;                       1 = VGA ROM 8x14
  230. ;                       2 = User defined bitmapped font
  231. ;
  232. ;
  233. ; WARNING: A user font must be registered before setting FontID 2
  234. ;
  235. ; Written by Themie Gouthas
  236. ; modified by Court Demas 10/1/92
  237. ;----------------------------------------------------------------------
  238.  
  239.     public _SetFont
  240. _SetFont proc
  241. ARG FontID:word
  242.     push bp
  243.     mov  bp,sp
  244.  
  245.     xor  dx,dx             ; Clear DX - Mirror table offset (0 for non ROM fonts)
  246.     mov  cx,FontID
  247.     cmp  cx,2
  248.  
  249.     jne  @@not_userfont     ; Do we have a user font
  250.     mov  ax,[_UserFontPtr]   ; Yes - Activate it
  251.     mov  [_FontPtr],ax
  252.  
  253.     mov  ax,[_UserFontPtr+2]
  254.     mov  [_FontPtr+2],ax
  255.  
  256.     mov  al,[_UserChHeight]
  257.     mov  [_CharHeight],al   ; Set the font character heights
  258.  
  259.     mov  al,[_UserChWidth]
  260.     mov  [_CharWidth],al    ; Set the font character heights
  261.  
  262.     mov  al,[_UserFirstCh]
  263.     mov  [_FirstChar],al
  264.     jmp  short @@done
  265.  
  266. @@not_userfont:              ; We have a ROM font
  267.  
  268.     mov  dx,offset MirrorTable
  269.     mov  [_CharWidth],8        ; Set the font character widths
  270.     mov  [_FirstChar],0        ; Character sets start at ascii 0
  271.     cmp  cx,1                  ; Do we have an 8x14 ROM font
  272.     jne  @@not_8x14font        ; No, we have 8x8 - jump
  273.  
  274.     mov  ax,[F8x14Ptr]         ; Yes Activate it
  275.     mov  [_FontPtr],ax
  276.  
  277.     mov  ax,[F8x14Ptr+2]
  278.     mov  [_FontPtr+2],ax
  279.  
  280.     mov  [_CharHeight],14    ; Set the font character heights
  281.     jmp  short @@done
  282.  
  283. @@not_8x14font:
  284.     mov  ax,[F8x8Ptr]        ; Activate the 8x8 ROM Font
  285.     mov  [_FontPtr],ax
  286.  
  287.     mov  ax,[F8x8Ptr+2]
  288.     mov  [_FontPtr+2],ax
  289.  
  290.     mov  [_CharHeight],8     ; Set the font character heights
  291.  
  292. @@done:
  293.     mov  cs:[MirrorTableOffs],dx
  294.  
  295.     pop  bp
  296.     ret
  297. _SetFont endp
  298.  
  299.  
  300.  
  301. ;----------------------------------------------------------------------
  302. ; RegisterUserFont - Mode X register user font
  303. ;
  304. ; C caller:
  305. ;
  306. ;  x_register_userfont(void far *user_font)
  307. ;
  308. ;
  309. ; NOTES  registering a user font deregisters the previous user font
  310. ;        User fonts may be at most 8 pixels wide
  311. ;
  312. ;
  313. ; USER FONT STRUCTURE
  314. ;
  315. ;  Word:  ascii code of first char in font
  316. ;  Byte:  Height of chars in font
  317. ;  Byte:  Width of chars in font
  318. ;  n*h*Byte: the font data where n = number of chars and h = height
  319. ;      of chars
  320. ;
  321. ; WARNING: The onus is on the program to ensure that all characters
  322. ;          drawn whilst this font is active, are within the range of
  323. ;          characters defined.
  324. ;
  325. ; Written by Themie Gouthas
  326. ;----------------------------------------------------------------------
  327.     public _RegisterUserFont
  328. _RegisterUserFont proc
  329.     ARG  FontToRegister:dword
  330.     push bp
  331.     mov  bp,sp
  332.     push si
  333.  
  334.     mov  ax,word ptr [FontToRegister]
  335.     mov  bx,word ptr [FontToRegister+2]
  336.     add  ax,4
  337.     mov  [_UserFontPtr],ax
  338.     mov  [_UserFontPtr+2],bx
  339.  
  340.     push ds
  341.     lds  si,[FontToRegister]
  342.     lodsw
  343.     mov  bx,ax
  344.     lodsw
  345.     pop  ds
  346.  
  347.     mov  [_UserChHeight],al
  348.     mov  [_UserChWidth],ah
  349.     mov  [_UserFirstCh],bl
  350.     pop  si
  351.     pop  bp
  352.     ret
  353. _RegisterUserFont endp
  354.  
  355.  
  356.  
  357. ;----------------------------------------------------------------------
  358. ; PutChar - Mode X Draw a text character at the specified location
  359. ;
  360. ;
  361. ; C caller:
  362. ;
  363. ;  PutChar(char ch, int x, int y, unsigned Color)
  364. ;
  365. ; PARAMETERS  ch        char to draw
  366. ;             x,y       screen coords at which to draw ch
  367. ;             ScrnOffs  Starting offset of page on whih to draw
  368. ;          Color     Color of the text
  369. ;
  370. ; NOTES:  Uses the current font settings. See SetFont, InitTextDriver,
  371. ;         RegisterUserFont
  372. ;
  373. ; WARNING: InitTextDriver must be called before using this function
  374. ;
  375. ;
  376. ; Written by Themie Gouthas
  377. ; modified by Court Demas
  378. ;----------------------------------------------------------------------
  379.     public _PutChar
  380. _PutChar  proc
  381. ARG  Chr:byte, X:word, Y:word, Color:word
  382. LOCAL ScreenInc:word,Hold:word=LocalStk
  383.     push bp
  384.     mov  bp,sp
  385.     sub  sp,LocalStk
  386.     push si
  387.     push di
  388.     push ds
  389.  
  390.     cld
  391.     mov  ax,[_Virtual_Width_Addr] ; AX = Virtual screen width
  392.     mov  bx,ax                      ; copy Virt screen width and decrement
  393.     sub  bx,3                       ; by the max number of bytes (whole or part)
  394.                     ; that a character row may occupy on the screen
  395.     mov  [ScreenInc],bx             ; Save it to the local stack var. SceenInc
  396.     mul  [Y]                        ; Find the starting dest. screen address of
  397.     mov  di,[X]                     ;  the character to draw
  398.     mov  cx,di
  399.     shr  di,2
  400.     add  di,ax
  401.     add  di,[_Draw_Offset]              ; Dont forget to compensate for page
  402.  
  403.     mov  ax,_ModeX_Segment          ; ES:DI -> first screen dest. byte of char
  404.     mov  es,ax
  405.  
  406.     and  cx,3                       ; CH = 0, CL = Plane of first pixel
  407.  
  408.     mov  bx,cs:[MirrorTableOffs]    ; set BX to offset of mirror table for XLAT
  409.     mov  al,[_CharHeight]           ; AL = Character height, AH = 0
  410.     xor  ah,ah
  411.     mov  ch,al                      ; CL = Character height
  412.     mov  dl,[Chr]                   ; User fonts may have incomplete charsets
  413.     sub  dl,[_FirstChar]            ;  this compensates for fonts not starting at
  414.                     ;  ascii value 0
  415.     mul  dl                         ; Mult AX by character to draw giving offset
  416.                     ; of first character byte in font table
  417.  
  418.     lds  si,dword ptr [_FontPtr]    ; DS:SI -> beggining of required font
  419.     add  si,ax                      ; DS:SI -> first byte of req. char
  420.  
  421.     mov  dx,SC_INDEX                ; Prepare for VGA out's
  422.  
  423.   @@MainLoop:
  424.  
  425.     lodsb               ; load character byte into AL
  426.     or   bx,bx          ; if BX=0 -> User font, so no need to mirror data
  427.     jz   @@DontMirror
  428.     push ds
  429.     mov  dx,cs          ; Set DS to the Mirror lookup table's segment
  430.     mov  ds,dx          ; - BX should already contain the offset addr of table
  431.     xlatb               ; AL is now replaced by the corresponding table entry
  432.     pop  ds             ; Restore previous data segment
  433.     mov  dx,SC_INDEX    ; Restore DX
  434.  
  435.   @@DontMirror:
  436.     xor  ah,ah          ; shift the byte for the dest plane and save it
  437.     shl  ax,cl
  438.     mov  [Hold],ax
  439.  
  440.     mov  ah,al                 ; output high nibble of first byte of shifted char
  441.     mov  al,MAP_MASK
  442.     out  dx,ax
  443.     mov  al,byte ptr [Color]
  444.     stosb
  445.                    ; output low nibble of first byte of shifted char
  446.     mov  ax,[Hold]
  447.     shl  ax,4
  448.     mov  al,MAP_MASK
  449.     out  dx,ax
  450.     mov  al,byte ptr [Color]
  451.     stosb
  452.  
  453.     mov  ax,[Hold]             ; output high nibble of last byte of shifted char
  454.     mov  al,MAP_MASK           ; completing the drawing of one character row
  455.     out  dx,ax
  456.     mov  al,byte ptr [Color]
  457.     stosb
  458.  
  459.     add  di,[ScreenInc]        ; Now move to the next screen row and do the same
  460.     dec  ch                    ; any remaining character bytes
  461.     jnz  @@MainLoop
  462.     pop  ds
  463.     mov  ah,0
  464.     mov  al,[_CharWidth]       ; return the character width (for string fuctions
  465.     pop  di                    ; using this character drawing function).
  466.     pop  si
  467.     mov  sp,bp
  468.     pop  bp
  469.     ret
  470. _PutChar endp
  471.  
  472. ;----------------------------------------------------------------------------
  473. END